#include "main.h"
sqlite3 *db;
char *emsg;
msg_node msg;
reg s1;
int fd;
void _register() // 注册
{
    msg.type = 1;
    reg s1;
    printf("请输入用户名:");
    scanf("%s", s1.name);
    printf("请输入密码:");
    scanf("%d", &s1.passwd);
    printf("请输入身份:");
    scanf("%s", s1.position);
    s1.fd = 0;
    memcpy(msg.buf, &s1, sizeof(reg));
    write(fd, &msg, sizeof(msg));
}
void clockIn() // 打卡
{
    dk d1;
    printf("请输入几月和几日:");
    scanf("%d %d", &d1.mouth, &d1.day);
    d1.sign = 0; // 0：缺勤，1：出勤，2：请假
    strcpy(d1.name, s1.name);
    msg.type = 4;

    memcpy(msg.buf, &d1, sizeof(dk));
    write(fd, &msg, sizeof(msg));
}
pthread_t pt;
void *rec(void *p) // 在线接收消息
{
    while (1)
    {
        // pthread_mutex_lock(&t4);
        int ret = read(fd, &msg, sizeof(msg));
        if (ret = 0)
        {
            break;
        }

        chat s = *(chat *)msg.buf;
        if (msg.type == 1801)
        {

            printf("%s群聊发送:%s\n", s.othername, s.test);
            if (strcmp(s.test, "*") == 0)
            {
                // pthread_mutex_unlock(&t2);
                // pthread_mutex_unlock(&t3);
                printf("%s已退出群聊\n", s.othername);
                // break;
            }
            continue;
        }
        if (msg.type = 19)
        {
            sd s = *(sd *)msg.buf;
            // sprintf(s.filename,"cc%s",s.filename);
            // FILE *fp = fopen(s.filename, "ab");
            FILE *fp = fopen("3.pdf", "ab");
            fwrite(s.buf, 1, s.flag, fp);
            fclose(fp);
        }
        if (msg.type == 1702)
        {
            printf("该用户未上线,内容已存入记录\n");
        }
        else
        {
            printf("%s发来:%s\n", s.selfname, s.test);
        }
        if (strcmp(s.test, "#") == 0)
        {

            printf("%s已退出私聊\n", s.othername);

        }


    }
}
void *ework(void *p) // 查看请假申请情况
{

    int ret = 1;
    while (1)
    {
        read(fd, &msg, sizeof(msg));
        printf("msg.buf=%s\n", msg.buf);
        if (msg.type == 502)
        {
            if (strcmp(msg.buf, "#") != 0)
            {
                pml p = *(pml *)msg.buf;
                printf("%s的请假申请还未批准请等待\n", p.date);
            }
            else
            {
                break;
            }
        }
        if (msg.type == 503)
        {
            if (strcmp(msg.buf, "#") != 0)
            {
                pml p = *(pml *)msg.buf;
                printf("%s的请假申请已批准\n", p.date);
            }
            else
            {
                break;
            }
        }
        if (msg.type == 504)
        {
            if (strcmp(msg.buf, "#") != 0)
            {
                pml p = *(pml *)msg.buf;
                printf("%s的请假申请已批准\n", p.date);
            }
            else
            {
                break;
            }
        }
        if (msg.type == 505)
        {
            // printf("1111111\n");
            break;
        }
    }
}
void Employeeleave() // 员工请假
{
    pthread_cancel(pt2);
    pthread_create(&pt, NULL, ework, &fd);
    dk d1;
    strcpy(d1.name, s1.name);
    d1.mouth = 0;
    d1.day = 0;
    d1.sign = 0;
    msg.type = 501; // 查看请假进程
    write(fd, &msg, sizeof(msg));
    printf("---------------\n");
    pthread_join(pt, NULL);

    dk d2;
    printf("请输入几月和几日请假:");
    scanf("%d %d", &d1.mouth, &d1.day);
    d1.sign = 0;
    strcpy(d1.name, s1.name);
    msg.type = 5;
    memcpy(msg.buf, &d1, sizeof(dk));
    write(fd, &msg, sizeof(msg));
    printf("申请成功请等待审核\n");

    pthread_create(&pt2, NULL, rec, &fd);
}
void permitleave() // 批假系统
{
    pthread_cancel(pt2);
    int ret = 1;
    msg.type = 6;
    write(fd, &msg, sizeof(msg));
    while (ret)
    {
        ret = read(fd, &msg, sizeof(msg));
        if (msg.type == 602)
        {
            printf("未发现员工请求\n");
            return;
        }
        if (strcmp(msg.buf, "#") != 0)
        {
            pml d = *(pml *)msg.buf;
            printf("员工:%s申请请假,时间:%s\n", d.name, d.date);
            printf("是否批准%s的请假(1同意/2驳回)\n", d.name);
            scanf("%d", &d.stat);

            memcpy(msg.buf, &d, sizeof(d));
            write(fd, &msg, sizeof(msg));
        }
        else
        {
            ret = 0;
        }
    }
    pthread_create(&pt2, NULL, rec, &fd);
}
void Checksalary() // 查看工资
{
    pthread_cancel(pt2);
    msg.type = 7;
    memcpy(msg.buf, &s1, sizeof(s1));
    write(fd, &msg, sizeof(msg));

    read(fd, &msg, sizeof(msg));
    if (msg.type == 702)
    {
        printf("工资条不存在\n");
        return;
    }

    money m = *(money *)msg.buf;

    printf("本月工资为:%f,钱包余额:%f\n", m.wage, m.wallet);
    pthread_create(&pt2, NULL, rec, &fd);
}
void paywages() // 发工资
{
    pthread_cancel(pt2);
    msg.type = 8;
    write(fd, &msg, sizeof(msg));
    while (1)
    {
        read(fd, &msg, sizeof(msg));
        printf("%s\n", msg.buf);
        if (strcmp(msg.buf, "#") == 0)
        {
            break;
        }
        if (msg.type == 801)
        {
            printf("%s的工资发放完毕\n", msg.buf);
        }
    }
    pthread_create(&pt2, NULL, rec, &fd);
}
void Topup() // 客户充值
{
    pthread_cancel(pt2);
    topup tp;
    msg.type = 9;
    printf("请输入充值金额:");
    scanf("%f", &tp.jine);
    strcpy(tp.name, s1.name);
    memcpy(msg.buf, &tp, sizeof(tp));
    write(fd, &msg, sizeof(msg));

    read(fd, &msg, sizeof(msg));
    topup tp1 = *(topup *)msg.buf;
    printf("充值成功，%s钱包余额%f\n", tp1.name, tp1.jine);

    pthread_create(&pt2, NULL, rec, &fd);
}
void signbill() // 员工录单
{
    pthread_cancel(pt2);
    sb s;
    msg.type = 10;
    printf("请输入客户名字:");
    scanf("%s", s.othername);
    strcpy(s.selfname, s1.name);
    memcpy(msg.buf, &s, sizeof(s));
    write(fd, &msg, sizeof(msg));
    while (1)
    {

        int ret = read(fd, &msg, sizeof(msg));
        if (ret <= 0)
        {
            break;
        }
        if (msg.type == 1002) // 客户不存在
        {
            printf("不存在的客户\n");
        }
        mcg m = *(mcg *)msg.buf;
        printf("m.cbalance=%f\n", m.cbalance);
        if (m.cbalance == 3000) // 客户不存在
        {
            printf("客户已购买电脑,成功录入\n");
        }
        if (m.cbalance == 2000) // 客户不存在
        {
            printf("客户已购买手机,成功录入\n");
        }
        if (m.cbalance == 50) // 客户不存在
        {
            printf("客户已购买鼠标,成功录入\n");
        }
        if (m.cbalance == 40) // 客户不存在
        {
            printf("客户已购买键盘,成功录入\n");
        }
        if (m.cbalance == 100) // 客户不存在
        {
            printf("客户已购买充电器,成功录入\n");
        }
    }
    pthread_create(&pt2, NULL, rec, &fd);
}
void purchase() // 客户购买产品
{
    pthread_cancel(pt2);
    while (1)
    {
        read(fd, &msg, sizeof(msg));
        cw c = *(cw *)msg.buf;
        store();
        printf("【%s钱包余额:%f 积分:%f】 请输入你要购买的商品\n", c.name, c.balance, c.jifen);
        int ch;
        scanf("%d", &ch);
        switch (ch)
        {
        case 1:
        {
            mcg m1;
            m1.cbalance = 3000;
            m1.cjifen = 300;
            memcpy(msg.buf, &m1, sizeof(m1));
            write(fd, &msg, sizeof(msg));
        }
        break;
        case 2:
        {
            mcg m2;
            m2.cbalance = 2000;
            m2.cjifen = 200;
            memcpy(msg.buf, &m2, sizeof(m2));
            write(fd, &msg, sizeof(msg));
        }
        break;
        case 3:
        {
            mcg m3;
            m3.cbalance = 50;
            m3.cjifen = 5;
            memcpy(msg.buf, &m3, sizeof(m3));
            write(fd, &msg, sizeof(msg));
        }
        break;
        case 4:
        {
            mcg m4;
            m4.cbalance = 40;
            m4.cjifen = 5;
            memcpy(msg.buf, &m4, sizeof(m4));
            write(fd, &msg, sizeof(msg));
        }
        break;
        case 5:
        {
            mcg m5;
            m5.cbalance = 100;
            m5.cjifen = 10;
            memcpy(msg.buf, &m5, sizeof(m5));
            write(fd, &msg, sizeof(msg));
        }
        break;
        case 0:
        {
            strcpy(msg.buf, "#");
            write(fd, &msg, sizeof(msg));
            pthread_create(&pt2, NULL, rec, &fd);
            return;
        }
        break;
        default:
            break;
        }
    }
}
void replenishment() // 补卡
{
    pthread_cancel(pt2);
    msg.type = 11;
    printf("你要给谁补签\n");
    char name[50];
    scanf("%s", name);

    strcpy(msg.buf, name);
    write(fd, &msg, sizeof(msg));

    printf("%s的打卡情况如下:\n", name);
    while (1)
    {
        read(fd, &msg, sizeof(msg));
        if (strcmp(msg.buf, "#") == 0)
        {
            printf("$$$$$$$msg.buf=%s######\n", msg.buf);
            break;
        }

        pml p1 = *(pml *)msg.buf;
        // printf("------p1.stat=%d-----\n", p1.stat);
        if (p1.stat == 1)
        {
            printf("%s正常卡\n", p1.date);
        }
        if (p1.stat == 2)
        {
            printf("%s请假卡\n", p1.date);
        }
        if (p1.stat == 0)
        {
            printf("%s缺勤卡\n", p1.date);
        }
    }
    printf("请正确输入补卡日期(例如:8月1日):\n");
    pml p2;
    scanf("%s", p2.date);
    strcpy(p2.name, name);
    printf("请输入补卡状态(0缺勤/1出勤/2请假):\n");
    scanf("%d", &p2.stat);
    memcpy(msg.buf, &p2, sizeof(p2));
    write(fd, &msg, sizeof(msg));

    printf("成功给%s在%s补卡\n", p2.name, p2.date);
    pthread_create(&pt2, NULL, rec, &fd);
}
void Viewperformance() // 查看业绩
{
    pthread_cancel(pt2);
    msg.type = 12;
    printf("你要查看谁的业绩:");
    scanf("%s", msg.buf);
    char name[50];
    strcpy(name, msg.buf);
    write(fd, &msg, sizeof(msg));

    read(fd, &msg, sizeof(msg));
    if (msg.type == 1202)
    {
        printf("%s的工资条还未创建\n", name);
    }
    else
    {
        printf("%s的8月业绩为:%s\n", name, msg.buf);
    }
    pthread_create(&pt2, NULL, rec, &fd);
}
void dimissionl() // 离职申请
{
    pthread_cancel(pt2);
    msg.type = 13;
    sb s;
    strcpy(s.selfname, s1.name);
    printf("你想把你的客户交给谁:");
    scanf("%s", s.othername);
    memcpy(msg.buf, &s, sizeof(s));
    write(fd, &msg, sizeof(msg));

    read(fd, &msg, sizeof(msg));
    if (msg.type == 1301)
    {
        printf("离职申请已发送,请等待管理员操作\n");
        exit(0);
    }
    pthread_create(&pt2, NULL, rec, &fd);
}
void Approvalseparation() // 审批离职申请
{
    pthread_cancel(pt2);
    msg.type = 14;
    write(fd, &msg, sizeof(msg));

    while (1)
    {
        read(fd, &msg, sizeof(msg));
        if (strcmp(msg.buf, "#") == 0)
        {
            break;
        }

        sb s = *(sb *)msg.buf;
        printf("你是否同意%s的离职申请(1同意/2拒绝),并将客户转给%s\n", s.selfname, s.othername);
        char ch[50];
        scanf("%s", ch);
        strcpy(msg.buf, ch);
        write(fd, &msg, sizeof(msg));

        printf("%s申请已处理\n", s.selfname);
    }
    pthread_create(&pt2, NULL, rec, &fd);
}
void Searchpurchasehistory() // 查看历史购买记录
{
    pthread_cancel(pt2);
    msg.type = 15;
    strcpy(msg.buf, s1.name);
    write(fd, &msg, sizeof(msg));

    int msum = 0, jfsum = 0;
    while (1)
    {
        read(fd, &msg, sizeof(msg));
        if (strcmp(msg.buf, "#") == 0)
        {
            printf("总共消费了%d元获得了%d的积分\n", msum, jfsum);
            break;
        }

        ph p = *(ph *)msg.buf;
        printf("你在员工%s那购买过%s\n", p.name, p.changpin);
        if (strcmp(p.changpin, "电脑") == 0)
        {
            msum += 3000;
            jfsum += 300;
        }
        if (strcmp(p.changpin, "手机") == 0)
        {
            msum += 2000;
            jfsum += 200;
        }
        if (strcmp(p.changpin, "鼠标") == 0)
        {
            msum += 50;
            jfsum += 5;
        }
        if (strcmp(p.changpin, "键盘") == 0)
        {
            msum += 40;
            jfsum += 4;
        }
        if (strcmp(p.changpin, "充电器") == 0)
        {
            msum += 100;
            jfsum += 10;
        }
    }
    pthread_create(&pt2, NULL, rec, &fd);
}
void creditsexchange() // 积分兑换系统
{
    pthread_cancel(pt2);
    msg.type = 16;
    strcpy(msg.buf, s1.name);
    write(fd, &msg, sizeof(msg));

    read(fd, &msg, sizeof(msg));
    printf("已将%s积分全转换为现金\n", msg.buf);

    pthread_create(&pt2, NULL, rec, &fd);
}
void privatechat() // 私聊
{
    // pthread_mutex_lock(&t1);

    msg.type = 17;
    chat s;
    printf("你要和谁聊天:");

    scanf("%s", s.othername);
    strcpy(s.selfname, s1.name);
    while (1)
    {
        printf("请输入内容:\n");
        scanf("%s", s.test);
        memcpy(&msg.buf, &s, sizeof(s));
        printf("给%s发消息\n", s.othername);
        msg.type = 17;
        write(fd, &msg, sizeof(msg));
        if (strcmp(s.test, "#") == 0)
        {
            // pthread_cancel(pt2);
            break;
        }

        // pthread_mutex_unlock(&t2);
    }
    // pthread_mutex_unlock(&t2);
}

void *work(void *p) // 接收留言消息
{

    msg.type = 111;
    while (1)
    {
        // printf("---111---\n");
        // pthread_mutex_lock(&t2);

        strcpy(msg.buf, s1.name);
        write(fd, &msg, sizeof(msg));
        while (1)
        {

            read(fd, &msg, sizeof(msg));
            // printf("---msg.type=%d---\n",msg.type);
            if (strcmp(msg.buf, "#") == 0)
            {

                // pthread_mutex_unlock(&t1);
                // pthread_mutex_unlock(&t4);
                pthread_create(&pt2, NULL, rec, &fd);
                pthread_cancel(pt1);
                break;
            }

            if (msg.type == 1701) // 私聊消息
            {
                // printf("---len=%d---\n",strlen(msg.buf));
                chat s = *(chat *)msg.buf;
                printf("%s:%s\n", s.othername, s.test);
            }
        }
    }
}

void groupchat() // 群聊
{

    chat s;
    strcpy(s.selfname, s1.name);
    strcpy(s.othername, s1.name);
    while (1)
    {

        printf("发送内容:");
        scanf("%s", s.test);
        msg.type = 18;
        // getchar();
        memcpy(&msg.buf, &s, sizeof(s));
        int ret = write(fd, &msg, sizeof(msg));
        printf("ret=%d %d\n", ret, msg.type);
        msg.type = 18;
        if (strcmp(s.test, "*") == 0)
        {

            printf("%s已退出群聊\n", s.othername);
            break;
        }
    }
}
void Senddocument() // 发文件
{
    pthread_cancel(pt2);
    msg.type = 19;
    sd s;
    printf("发给谁:");
    scanf("%s", s.name);
    // printf("输入路径:");
    // char lujin[50];
    // scanf("%s",lujin);
    // printf("输入文件名:");
    // scanf("%s",s.filename);
    // char hebin[100];
    // sprintf(hebin,"%s/%s",lujin,s.filename);
    // FILE *fp = fopen(hebin, "rb");
    FILE *fp = fopen("2.pdf", "rb");
    int a = 1, count = 0, send = 1;
    while (a)
    {
        int ret = 0;
        while (ret != BUF_SIZE)
        {
            ret += fread(s.buf + ret, 1, BUF_SIZE - ret, fp);
            count += ret;
            if (feof(fp))
            {
                a = 0;
                break;
            }
        }
        s.flag = ret;
        memcpy(&msg.buf, &s, sizeof(s));
        write(fd, &msg, sizeof(msg));
        printf("本次传输%d个字节,总共传输%d个字节\n", s.flag, count);
    }
    fclose(fp);
    pthread_create(&pt2, NULL, rec, &fd);
}
void _denlu() // 登录
{
    printf("请输入用户名:");
    scanf("%s", s1.name);
    printf("请输入密码:");
    scanf("%d", &s1.passwd);
    strcpy(s1.position, "#");
    s1.fd = 0;

    msg.type = 2;

    memcpy(msg.buf, &s1, sizeof(reg));
    write(fd, &msg, sizeof(msg));

    read(fd, &msg, sizeof(msg));
    reg s2 = *(reg *)msg.buf;
    if (msg.type == 202)
    {
        printf("%s:%s登录失败\n", s2.position, s2.name);
        printf("请等待管理员处理离职申请\n");
        exit(0);
    }
    if (msg.type == 203)
    {
        printf("用户名或者密码错误\n");
    }
    if (msg.type == 201)
    {
        printf("%s:%s登录成功\n", s2.position, s2.name);

        pthread_create(&pt1, NULL, work, &fd);
        int ch; // 在循环外定义变量，再进行输入
        while (1)
        {
            // pthread_mutex_lock(&t3);

            staffinterface(s2.position, s2.name);

            // printf("^ch=%d^^^\n", ch);
            scanf("%d", &ch);

            switch (ch)
            {
            case 1:
            {
                chatinterface();

                int ch;
                scanf("%d", &ch);
                if (ch == 1)
                {
                    privatechat();
                }
                if (ch == 4)
                {
                    Senddocument();
                }
            }
            break;
            case 2:
                groupchat();
                break;
            case 3:
                if (strcmp(s2.position, "员工") == 0)
                    clockIn();
                if (strcmp(s2.position, "管理员") == 0)
                    replenishment();
                if (strcmp(s2.position, "客户") == 0)
                    Searchpurchasehistory();

                break;
            case 4:
            {
                if (strcmp(s2.position, "员工") == 0)
                    Employeeleave();
                if (strcmp(s2.position, "管理员") == 0)
                    permitleave();
                if (strcmp(s2.position, "客户") == 0)
                    creditsexchange();
            }
            break;
            case 5:
            {
                if (strcmp(s2.position, "员工") == 0)
                    Checksalary();
                if (strcmp(s2.position, "管理员") == 0)
                    paywages();
                if (strcmp(s2.position, "客户") == 0)
                    Topup();
            }
            break;
            case 6:
            {
                if (strcmp(s2.position, "员工") == 0)
                    signbill();
                if (strcmp(s2.position, "管理员") == 0)
                    Viewperformance();
                if (strcmp(s2.position, "客户") == 0)
                    purchase();
            }
            break;
            case 7:
            {
                if (strcmp(s2.position, "员工") == 0)
                    dimissionl();
                if (strcmp(s2.position, "管理员") == 0)
                    Approvalseparation();
                if (strcmp(s2.position, "客户") == 0)
                {
                    pthread_cancel(pt2);
                    return;
                }
            }
            break;
            case 8:
                pthread_cancel(pt2);
                return;

                break;
            default:
                break;
            }
        }
    }
}
void logout() // 客户注销
{
    reg s1;
    printf("请输入用户名:");
    scanf("%s", s1.name);
    printf("请输入密码:");
    scanf("%d", &s1.passwd);
    s1.fd = 0;

    msg.type = 3;

    memcpy(msg.buf, &s1, sizeof(reg));
    write(fd, &msg, sizeof(msg));

    read(fd, &msg, sizeof(msg));
    if (msg.type == 302)
    {
        printf("用户:%s未找到,输入错误\n", s1.name);
    }
    else
    {
        printf("客户:%s注销成功\n", s1.name);
    }
}
int main(int argc, char *argv[])
{
    fd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in addr = getaddr("192.168.50.176", 8000);
    if (-1 == connect(fd, (struct sockaddr *)&addr, sizeof(addr)))
        perror("connect");

    while (1)
    {
        denluinterface();
        int ch;
        scanf("%d", &ch);
        switch (ch)
        {
        case 1:
            _register();
            break;
        case 2:
            _denlu();
            break;
        case 3:
            logout();
            break;
        default:
            break;
        }
    }

    return 0;
}